import { useCallback, useEffect, useRef } from 'react';
import { 
  createMainAppCommunication, 
  createSubAppCommunication,
  getGlobalData,
  setGlobalData 
} from '../utils';
import type { 
  UseMicroAppCommunicationOptions, 
  UseMicroAppCommunicationReturn,
  CommunicationCallback,
  CommunicationCleanup 
} from '../types';

/**
 * useMicroAppCommunication Hook
 * 
 * 功能特性：
 * - 提供发送数据功能 (sendToMain, sendToSubApp, broadcast)
 * - 提供接收数据功能 (onDataFromMain, onDataFromSubApp)
 * - 提供全局数据功能 (setGlobalData, getGlobalData)
 * - 处理通信错误
 * - 自动清理监听器
 * - 支持主应用和子应用模式
 */
export function useMicroAppCommunication(
  options: UseMicroAppCommunicationOptions,
): UseMicroAppCommunicationReturn {
  const {
    appName,
    appType,
    enableGlobalData = true,
    enableSubAppCommunication = true,
  } = options;

  // 清理函数引用
  const cleanupRef = useRef<CommunicationCleanup[]>([]);

  // 创建通信实例
  const communication = appType === 'main' 
    ? createMainAppCommunication() 
    : createSubAppCommunication(appName);

  // 发送数据到主应用（仅子应用可用）
  const sendToMain = useCallback((data: any) => {
    if (appType !== 'sub') {
      console.warn('sendToMain 只能在子应用中使用');
      return;
    }

    try {
      (communication as any).sendToMain(data);
    } catch (error) {
      console.error('发送数据到主应用失败:', error);
    }
  }, [appType, communication]);

  // 发送数据到子应用
  const sendToSubApp = useCallback((targetAppName: string, data: any) => {
    try {
      if (appType === 'main') {
        (communication as any).sendToSubApp(targetAppName, data);
      } else if (enableSubAppCommunication) {
        (communication as any).sendToSubApp(targetAppName, data);
      } else {
        console.warn('子应用间通信未启用');
      }
    } catch (error) {
      console.error(`发送数据到子应用 ${targetAppName} 失败:`, error);
    }
  }, [appType, enableSubAppCommunication, communication]);

  // 广播数据
  const broadcast = useCallback((data: any) => {
    try {
      if (appType === 'main') {
        (communication as any).broadcastToAllSubApps(data);
      } else {
        // 子应用通过全局数据进行广播
        if (enableGlobalData) {
          setGlobalData({
            type: 'BROADCAST',
            source: appName,
            data,
            timestamp: Date.now(),
          });
        } else {
          console.warn('全局数据功能未启用，无法广播');
        }
      }
    } catch (error) {
      console.error('广播数据失败:', error);
    }
  }, [appType, appName, enableGlobalData, communication]);

  // 监听来自主应用的数据（仅子应用可用）
  const onDataFromMain = useCallback((callback: CommunicationCallback): CommunicationCleanup => {
    if (appType !== 'sub') {
      console.warn('onDataFromMain 只能在子应用中使用');
      return () => {};
    }

    try {
      const cleanup = (communication as any).onDataFromMain(callback);
      cleanupRef.current.push(cleanup);
      return cleanup;
    } catch (error) {
      console.error('监听主应用数据失败:', error);
      return () => {};
    }
  }, [appType, communication]);

  // 监听来自子应用的数据
  const onDataFromSubApp = useCallback((targetAppName: string, callback: CommunicationCallback): CommunicationCleanup => {
    try {
      if (appType === 'main') {
        const cleanup = (communication as any).onDataFromSubApp(targetAppName, callback);
        cleanupRef.current.push(cleanup);
        return cleanup;
      } else if (enableSubAppCommunication) {
        const cleanup = (communication as any).onDataFromSubApp(targetAppName, callback);
        cleanupRef.current.push(cleanup);
        return cleanup;
      } else {
        console.warn('子应用间通信未启用');
        return () => {};
      }
    } catch (error) {
      console.error(`监听子应用 ${targetAppName} 数据失败:`, error);
      return () => {};
    }
  }, [appType, enableSubAppCommunication, communication]);

  // 设置全局数据
  const setGlobalDataWrapper = useCallback((data: any) => {
    if (!enableGlobalData) {
      console.warn('全局数据功能未启用');
      return;
    }

    try {
      setGlobalData(data);
    } catch (error) {
      console.error('设置全局数据失败:', error);
    }
  }, [enableGlobalData]);

  // 获取全局数据
  const getGlobalDataWrapper = useCallback(() => {
    if (!enableGlobalData) {
      console.warn('全局数据功能未启用');
      return null;
    }

    try {
      return getGlobalData();
    } catch (error) {
      console.error('获取全局数据失败:', error);
      return null;
    }
  }, [enableGlobalData]);

  // 组件卸载时清理所有监听器
  useEffect(() => {
    return () => {
      console.log(`清理 ${appName} 的通信监听器`);
      cleanupRef.current.forEach(cleanup => cleanup());
      cleanupRef.current = [];
    };
  }, [appName]);

  return {
    // 发送数据
    sendToMain,
    sendToSubApp,
    broadcast,

    // 接收数据
    onDataFromMain,
    onDataFromSubApp,

    // 全局数据
    setGlobalData: setGlobalDataWrapper,
    getGlobalData: getGlobalDataWrapper,
  };
}